如何在子对象字段中按值查找SMW中的相关条目

时间:2017-02-20 15:50:48

标签: mediawiki semantic-mediawiki

太糟糕的文档让我在mediawiki和语义mediawiki中疯狂。 smw_object_ids中的列子对象是什么意思?如何在上面指定的列中找到与_QUERYgjdfghjsag9u05sdfa之类的内容相关的记录?

修改

smw_proptable_hash应该保留哪些数据?如果我反序列化,我会看到:

array (
  'smw_di_number' => '3acec8ed7529527ac33713b1668f31c2',
  'smw_di_blob' => 'c201d67c4b8317d31b05d38d796671d2',
  'smw_di_time' => 'eff3878694d4aee1e88eb979bbd30097',
  'smw_di_wikipage' => 'e474079e8c5fab4ec7197d6aaa884032',
  'smw_fpt_ask' => 'e721ae2cb8f49309e10a27467306644c',
  'smw_fpt_inst' => 'c7af3f2c8f2f5276c1284b3855358979',
  'smw_fpt_sobj' => '7fe51e1a5b9c41d770d3dd8b1e1a16fa',
  'smw_fpt_mdat' => 'a400d86be3f69fbb788c4cfcdddaf077',
  'smw_fpt_cdat' => 'd063996afa76760ea758a1ab13deb191',
)

但是我无法在指定的表格中找到它们。

3 个答案:

答案 0 :(得分:1)

嗯,我相信您不应该执行原始SQL查询来浏览语义数据,因为SMW已经有了类和方法。虽然它们几乎没有记录,但您需要调查来源以了解其工作原理以及如何正确使用它。

您可以通过查看SemanticQueryInterface的来源找到一些示例,或者因为它支持子对象,您可以在代码中使用它。

答案 1 :(得分:1)

根据源代码

[`extensions/SemanticMediaWiki/includes/storage/SQLStore/SMW_SQLStore3_Writers.php:462 - preparePropertyTableUpdates`]

哈希生成如下:

$newHash = md5( serialize( array_values( $newData[$tableName] ) ) );

实例$ newData可能是

Array
(
    [smw_fpt_cdat] => Array
        (
            [0] => Array
                (
                    [s_id] => 2281824
                    [o_serialized] => 1/2017/3/22/13/26/37
                    [o_sortkey] => 2457835.0601505
                )

        )

    [smw_fpt_mdat] => Array
        (
            [0] => Array
                (
                    [s_id] => 2281824
                    [o_serialized] => 1/2017/3/22/13/26/37
                    [o_sortkey] => 2457835.0601505
                )

        )

    [smw_di_wikipage] => Array
        (
            [0] => Array
                (
                    [s_id] => 2281824
                    [p_id] => 754161
                    [o_id] => 2215135
                )

            [1] => Array
                (
                    [s_id] => 2281824
                    [p_id] => 754162
                    [o_id] => 2215135
                )

        )

    [smw_di_number] => Array
        (
            [0] => Array
                (
                    [s_id] => 2281824
                    [p_id] => 754163
                    [o_serialized] => 1
                    [o_sortkey] => 1
                )

            [1] => Array
                (
                    [s_id] => 2281824
                    [p_id] => 754164
                    [o_serialized] => 157470
                    [o_sortkey] => 157470
                )

            [2] => Array
                (
                    [s_id] => 2281824
                    [p_id] => 754165
                    [o_serialized] => 638908
                    [o_sortkey] => 638908
                )

        )

)

然后,如上所述,这些东西会得到更新 [extensions / SemanticMediaWiki / includes / storage / SQLStore / SMW_SQLStore3_Writers.php:611 - writePropertyTableRowUpdates]

==即将继续==

答案 2 :(得分:0)

请参阅讨论 https://www.semantic-mediawiki.org/wiki/Architecture_Tradeoffs

查看的SMW_TRIPLES和SWM_TRIPLES_NS将允许您访问存储在SQLStore3中的三元组的主题,谓词,对象和类型。

它的工作方式向您展示了SQLStore3数据库的一般结构如何链接项目。

现在你特意要求表smw_object_ids

包含以下列:

Field               Type            Null Key    Default Extra
smw_id              int(8) unsigned NO   PRI    (null)  auto_increment
smw_namespace       int(11)         NO          (null)  
smw_title           varbinary(255)  NO   MUL    (null)  
smw_iw              varbinary(32)   NO          (null)  
smw_subobject       varbinary(255)  NO          (null)  
smw_sortkey         varbinary(255)  NO   MUL    (null)  
smw_proptable_hash  mediumblob      YES         (null)  

能够查看您可能想要使用强制转换的varbinaries的内容,例如像

select smw_id as id, cast(smw_subobject as char) as subobject,cast(smw_title as char) 
as title 
from smw_object_ids
where length(smw_subobject)>0

现在您将看到该子对象具有附加到页面标题的内部哈希码,以使子对象在页面中可识别。

这是一个名为“HammerUndSichel”的页面示例,它有四个子对象:

id      subobject                           title
91147   _0a12ff61e3b10c31478f2ff62b49e68e   HammerUndSichel
91149   _52193085936ccfee4bc197ce37614073   HammerUndSichel
91207   _7fba483328e69e6aeb6dff0fc74447f4   HammerUndSichel
91148   _838fe1bff8f83dbfa40fb3314c47677b   HammerUndSichel

对于内部存储,使用“id”列,子对象列尚未开始播放。只有当您想要进行某种反向搜索时才会出现问题。例如。具有id 91147和子对象_ea12ff61e3b10c31478f2ff62b49e68e的子对象,您希望在该子对象中找到一些属性值集。在一个ask查询中,你使用SQL Store中的hasSubObject执行此操作,这会变得更加棘手。

SMW_TRIPLES_NS视图通过将命名空间和子对象信息添加到三元组中的每个主题来解决该问题。这允许唯一地识别子对象三元组。

关于哈希的问题的第二部分,请看一些似乎比我更能胜任这个问题的其他答案。